/**
 *******************************************************************************************************************************************
 * @file        main.c
 * @brief       主程序

 *******************************************************************************************************************************************
 */
#include <stdbool.h>
#include <stdint.h>
#include <string.h>

#include "SWM341.h"

#include "version.h"
#include "bsp_init.h"
#include "lvgl.h"
#include "log.h"
#include "lv_demo_widgets.h"
#include "lv_examples/lv_examples.h"
#include "variable_middle.h"
#include "user_app.h"
/*******************************************************************************************************************************************
 * Private Function
 *******************************************************************************************************************************************/
#include "lv_port_disp.h"
#include "lv_port_indev.h"
#include "lv_port_fs.h"
//**************************************


/*******************************************************************************************************************************************
 * Private Define
 *******************************************************************************************************************************************/
#define WDT_ENABLE              0 /**< 看门狗(1-使能, 0-失能) */
#define SLEEP_ENABLE            0 /**< 休眠演示(1-使能, 0-失能) */
#if (SLEEP_ENABLE != 0)
#include "power_manager.h"
/** 超过指定时长无触摸交互则进入低功耗睡眠 */
#define SLEEP_TIME_MS           (30 * 1000)
#endif

/*******************************************************************************************************************************************
 * Public Variable
 *******************************************************************************************************************************************/
/** 手指触摸释放时长 / ms, 反映屏幕多长时间未被点击, 一旦有新的点击触发, 其值立即清零 */
volatile uint32_t Systick_Ms_TP = 0;
volatile uint8_t one_ms_flag, led_flag;
volatile uint16_t one_ms_time;
/*******************************************************************************************************************************************
 * Private Prototype
 *******************************************************************************************************************************************/
static void gui_init(void);
static void user_app(void);
static void app_task_handler(void);


/*******************************************************************************************************************************************
 * Public Function
 *******************************************************************************************************************************************/
/**
 * @brief   C_Main
 */
int main(void)
{
    /* 等待硬件模块上电稳定 */
    for (uint32_t i = 0; i < 66666 * 88; ++i) __NOP();
    bsp_init();         //硬件初始化
    config_read();  //配置信息读取
    Buzzer_cotrl(500);//开机提示音
    gui_init();             //显示屏UI初始化
    user_app();
    for (;;)
    {
        /* 要处理 LVGL 的任务, 您需要定期调用 lv_task_handler() (间隔大约为 5ms 左右)
         * 要注意 LVGL 默认不是线程安全的, 一般放于任务队列较低的优先级
         */
        lv_task_handler();
        app_task_handler();
    }
    return 0;
}

/**
 * @brief   Systick ISR Callback
 * @note    1 ms 被调用 1 次, 执行时长不应超过计时周期
 */
void isr_systick(void)
{
    systick_inc_tick();
    lv_tick_inc(1);
    ++Systick_Ms_TP;
    one_ms_time++ ;
    if (one_ms_time > 500)
    {
        one_ms_time = 0;
        one_ms_flag = 1;
    }
    //**********************************
    if (s.off_line == 0)
    {
        off_line_time++;
        if (off_line_time > OFFLINE_OUT_TIME)
        {
            off_line_time = 0;
            s.off_line = 1;
            s.clear_page_data = 1;
        }
    }
    //********************************************
    if (s.send_run_flag == 0)
    {
        send_run_time++;
        if (send_run_time > SET_GET_PER)
        {
            send_run_time = 0;
            s.send_run_flag = 1;
        }
    }
    //*********************************************
    if (s.send_tx_dma)
    {
        send_tx_time++;
        if (send_tx_time > send_tx_len)
        {
            s.send_tx_dma = 0;
            send_tx_time = 0;
            stateflag = 0;
            receve_order0.Lenth = 0;
            s.uart0_receive_flag = 0;
            DE_485_RX();
        }
    }
    //*****************************************
    if (s.buzzer)
    {
        buzzer_time++;
        if (buzzer_time > buzzer_set_time)
        {
            buzzer_time = 0;
            BUZZER_OFF();
            s.buzzer = 0;
        }
    }
}

//******************************************************

static void app_task_handler(void)
{
    UART_Receive();   //数据解析进程
    UART_Send();    //数据发送进程
    //*******************************************
    if (one_ms_flag)
    {
        one_ms_flag = 0;
        if (led_flag)
        {
            led_flag = 0;
            LED_ON();
        }
        else
        {
            led_flag = 1;
            LED_OFF();
        }
        Ble_get_process();
    }
    //**************************************
    if (s.touch_buzzer)
    {
        s.touch_buzzer = 0;
        Buzzer_cotrl(200);
    }
    //********************************
    Clear_page_data();//页面原始数据清零
    //************************
    if (BLZ_IN == 0) //蓝牙连接检测，低电平有效
    {
        s.blue_connect = 1;
    }
    else
    {
        s.blue_connect = 0;
    }
}
//***************************************************
static void gui_init(void)
{
    lv_init();
    lv_port_disp_init();
    lv_port_indev_init();
    // lv_port_fs_init();
}

#if (WDT_ENABLE != 0)
/**
 * @brief   喂狗任务
 * @param   t  : 任务句柄
 * @retval  /
 * @note    两次喂狗之间 <必须> 至少 间隔 2 个WDT时钟周期(即 60 us)
 */
static void wdt_feed_cb(lv_task_t *t)
{
    WDT->FEED = 0x55;//WDT_Feed(WDT);
}
#endif

#if (SLEEP_ENABLE != 0)
/**
 * @brief   睡眠演示
 * @param   t  : 任务句柄
 * @retval  /
 */
static void sleep_cb(lv_task_t *t)
{
    if (Systick_Ms_TP >= SLEEP_TIME_MS) //超过指定时长无触摸交互
    {
        Systick_Ms_TP = 0;
        #if 1 /* 1-低功耗演示     0-复位演示 */
        #if (WDT_ENABLE != 0)
        /** 如果有用到看门狗需要关掉 */
        WDT_Stop(WDT);
        #endif
        pm_request(PM_MODE_SLEEP); /* PM_MODE_STOP */
        #if (WDT_ENABLE != 0)
        /** 如果休眠前看门狗处于打开状态, 则需要开启看门狗恢复 */
        //WDT_Init(WDT, wdt_int_ms, wdt_rst_ms);
        WDT_Feed(WDT);
        WDT_Start(WDT);
        #endif
        #else
        /**
         * ARM内核自带的系统软复位
         * 实际产品应用请使用 看门狗硬件外设, 其从硬件层面保证可靠性, 可确保寄存器的复位值均恢复默认
         */
        NVIC_SystemReset();
        while (1)
            ; /* 展会时自动复位以演示 */
        #endif
    }
}
#endif



/**
 * @brief   Go to User App Execute
 */
static void user_app(void)
{
    lv_demo_widgets();
    //*********************************************************
    #if(BLUE_ENABLE)
    send_BLE_Reset_order();
    s.get_name_flag = 1;
    s.mac_flag = 1;
    #endif
}


